BrainFuck 解释器
2018年05月21日
BrainFuck 是一种深奥难懂的计算机语言(=大脑去你的=),1993 年一个叫 Urban Müller 的人发明了这种语言。fuck 是脏话,所以百度百科把 BrainFuck 和谐成了 BrainF**k。
这种语言只有 8 种简单的指令和一个指针。看起来很简陋,但是 BF 也是图灵完备的~平常很少见有人用,一般都是作为程序员的娱乐项目。
8 种指令
指令 | 指令含义 |
---|---|
> | 指针加一 |
< | 指针减一 |
+ | 指针指向的字节的值加一 |
- | 指针指向的字节的值减一 |
. | 输出指针指向的单元内容 |
, | 输入内容到指针指向的单元 |
[ | 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 |
] | 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 |
数据存储在一个理论上无穷大的字节数组里,每个元素只有 1byte,初始值为 0,编码方式是 ASCII。
举例子:
例一
,+.
,
先读入一个字节,+
该字节自加一,.
输出该字节
最终就实现从键盘读入一个字节并对这个字节加一,然后输出。假如键盘输入了一个字符'A',执行指令之后将会输出'B'。
例二
,----------[----------------------.,----------]
这个程序会把从键盘读来的小写字符转换成大写。按回车键退出程序。
例三
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
这一段程序会输出'Hello World!' (你信不信?)。
如何构造 Brainfuck 解释器是一件既好玩又有挑战性的事情。作为一个 FE,我用JavaScript
实现了一个解释器。
利用了eval()
这个小恶魔~
js
function brainLuck(code, input) {
var brainFuck = new fuckObj(),
result = "",
inputArr = input.split("");
eval(
code
.split("")
.map(function (e) {
switch (e) {
case ",":
return "brainFuck.input(inputArr.shift());";
break;
case ".":
return "result+=brainFuck.output();";
break;
case ">":
return "brainFuck.moveright();";
break;
case "<":
return "brainFuck.moveleft();";
break;
case "+":
return "brainFuck.add();";
break;
case "-":
return "brainFuck.minus();";
break;
case "[":
return "while(brainFuck.current()!=0){";
break;
case "]":
return "}";
break;
default:
break;
}
})
.join("")
);
return result;
}
function fuckObj() {
this.data = [0];
this.i = 0;
this.moveright = function () {
// >
this.i++;
if (this.data[this.i] == undefined) this.data[this.i] = 0;
};
this.moveleft = function () {
// <
this.i--;
};
this.add = function () {
// +
this.data[this.i] = this.data[this.i] == 255 ? 0 : this.data[this.i] + 1;
};
this.minus = function () {
// -
this.data[this.i] = this.data[this.i] == 0 ? 255 : this.data[this.i] - 1;
};
this.input = function (data) {
// ,
this.data[this.i] = data.charCodeAt(0);
};
this.output = function () {
// .
return String.fromCharCode(this.data[this.i]);
};
this.current = function () {
return this.data[this.i];
};
}

信了吧?
quote
最后更新时间: 2025年09月02日